package it.unibo.refolding.pico;

import it.unibo.refolding.common.CommonThings;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;

public class ParsedAndTargetFile {
  public final Parsed parsed;
  public final Path targetFile;
  
  public ParsedAndTargetFile(Parsed parsed, Path targetFile) {
    this.parsed = Objects.requireNonNull(parsed);
    this.targetFile = Objects.requireNonNull(targetFile);
  }

  public PlainPicoDataAndTargetFile emptyOrOneToParsedAndTargetFile() {
    if (parsed.picoDataList.isEmpty()) {
      return new PlainPicoDataAndTargetFile(null, targetFile);
    } else {
      Preconditions.checkState(parsed.picoDataList.size() == 1);
      return new PlainPicoDataAndTargetFile(CommonThings.last(parsed.picoDataList), targetFile);
    }
  }

  public boolean isEmpty() {
    return parsed.isEmpty();
  }
  
  public PicoData onlyPlainPicoData() {
    return parsed.onlyPlainPicoData();
  }

  public static List<ParsedAndTargetFile> from(List<PlainPicoDataAndTargetFile> l) {
    List<ParsedAndTargetFile> a = new ArrayList<>(l.size());
    for (PlainPicoDataAndTargetFile p : l) {
      a.add(ParsedAndTargetFile.of(p));
    }
    return a;
  }

  public static ParsedAndTargetFile of(PlainPicoDataAndTargetFile p) {
    if (p.plainPicoData == null) {
      return new ParsedAndTargetFile(Parsed.NOT_PARSED, p.targetFile);
    } else {
      return new ParsedAndTargetFile(Parsed.from(ImmutableList.of(p.plainPicoData)), p.targetFile);
    }
  }

  public PlainPicoData last() {
    return parsed.last();
  }
}
